package com.ssm.jdk;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class JdkProxy implements InvocationHandler {

    // 被代理的对象
    private Object target;

    /**
     * 获取被代理后的对象
     *
     * @param target 被代理对象
     * @return
     */
    public Object getProxyInstance(Object target) {
        this.target = target;
        // 类加载器，类的接口，代理类
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),
                target.getClass().getInterfaces(), this);
    }

    /**
     * 代理逻辑
     *
     * @param proxy  被代理的对象 proxy
     * @param method 当前调用的方法 sayHello
     * @param args   当前方法的参数 []
     * @return 代理的结果
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("代理方法：真实对象调用前的逻辑");
        Object obj = method.invoke(target, args); //调用真实对象的方法
        System.out.println("代理方法：真实对象调用后的逻辑");
        return obj;
    }
}
